import random
import string

from django.contrib.auth.models import Group
from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response

from rest_framework.status import HTTP_204_NO_CONTENT, HTTP_404_NOT_FOUND,HTTP_202_ACCEPTED

from .serializers import Classesserializers,CreateuserSerializers
from .models import *
from celery_tasks.email.tasks import send_email_task
from rest_framework.permissions import IsAuthenticated
from utils.permission import TeacherPermission#权限控制
# Create your views here.


class ClassesViewset(viewsets.ModelViewSet):
    queryset = Classes.objects.filter(is_delete=False)
    serializer_class = Classesserializers
    #这个权限的功能是只有登入了才能访问
    # permission_classes = [IsAuthenticated]#只要是登入的都可以访问
    #这里写一个自己设置的权限
    # permission_classes = [TeacherPermission]#自己写定的权限
    #用测试软件的时候要把令牌写进请求头里面 key：Authorization 然后JWT 加令牌

    def get_serializer(self, *args, **kwargs):#重写这个方法，让不同的操作显示不同的序列化器
        if self.action == 'student':
            return CreateuserSerializers(*args, **kwargs)
        return Classesserializers(*args,**kwargs)

    #要在默认的视图集中加入其他的功能需要使用到装饰器
    @action(methods=['post'],detail=True)#detail是要不要对具体的数据进行操作
    def student(self, request,pk):
        #得到班级(是获取查询集的班级，而不是拿到所有班级)
        try:
            classes = self.queryset.get(id = pk)#get方法如果没有得到会报错，所以要做异常处理
        except classes.DoesNotExist:
            return Response(status=HTTP_404_NOT_FOUND)
        #得到前端数据
        data = request.data
        username = data['username']
        email = data['email']
        first_name = data['first_name']
        #查看用户是否存在与班级当中
        member = classes.member.filter(username=username)
        if member:
            return Response({'msg':'您已经处于该班级'})
        #存在返回提醒，不存在接着操作
        #查看是新生还是老生（即是否存在与user中）
        student = User.objects.filter(username=username)
        #如果是老生就直接添加班级,并且返回数据
        if student:
            student = student.first()#直接用filter查询出来的是一个查询集、
            classes.member.add(student)
            return Response(self.get_serializer(student).data)
        #如果是新生就先反序列化，校验添加入user表
        serializers = self.get_serializer(data=data)
        serializers.is_valid()
        use = User(username=username,email=email,first_name=first_name)#此处不能直接设置密码，不然后台数据库是可以看到的，要加密设置
        #随机生成密码
        source = string.digits+string.ascii_letters
        password = ''.join(random.sample(source,6))
        use.set_password(password)#给用户设置密码，密文设置
        use.save()
        #在发送邮箱
        # print(username,email,first_name,classes.name)
        #设置学生身份给用户
        group = Group.objects.get(id=2)
        group.user_set.add(use)
        #添加入指定的班级中
        classes.member.add(use)
        #生成邮件的异步处理
        send_email_task.delay(email,username,password,classes.name)
        #返回
        return Response(self.get_serializer(use).data,status=HTTP_202_ACCEPTED)



# class UserViewset(viewsets.ModelViewSet):
#     queryset = User.objects.filter()
#     serializer_class = CreateuserSerializers
